package com.cooperation;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class WaitNotifyExample {

    public synchronized void before(){

        System.out.println("before");
        notifyAll();
    }

    /**
     * 调用wait()使得线程等待某个条件满足，线程在等待时会被挂起，当其他线程的运行使得中国条件满足时，其他线程会调用notify()或者notityAll()来唤醒挂起的线程。只能在同步方法或者同步控制块中使用，否则在运行时报错IIIlegaMontiorStateException.
     *
     * 使用wait()挂起期间，线程会释放锁，因为如不释放锁，，其他线程就无法进入对象的同步方法或者同步控制块，那么就无法执行notify(）或者notifyAll()来唤醒挂起的线程，抽成死锁。
     */
    public synchronized void after(){
        try {
            wait();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("after");
    }


    public static void main(String [] args){
        ExecutorService executorService= Executors.newCachedThreadPool();

        WaitNotifyExample example=new WaitNotifyExample();
        executorService.execute(()-> example.after());
        executorService.execute(()-> example.before());
    }
}
